package com.znsd.zl.contract.utils;

import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import com.znsd.zl.contract.openfeign.SysOssService;
import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.io.FileUtils;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.annotation.Resource;
import java.io.*;
import java.util.HashMap;

/**
 * @ClassName: ContractCreate
 * @Program: zlhouse-manage
 * @Description: 合同数据注入
 * @Author: tangjun
 * @Date: 2020-08-19 11:03
 * @Version 1.0
 **/
@Component
public class ContractTemplateUtils {
	
	@Resource
	public SysOssService ossService;
	
	
	/**
	 * @Date  2020/8/19 0019
	 * @Author tangjun
	 * @Description //TODO
	 * @Date  2020/8/19 0019
	 * @param templateFilePath 合同模板文件路径
	 * @param data 数据内容
	 * @param formFlattening 确定合同的状态如果为false那么生成的PDF文件还能编辑，一定要设为true
	 * @param pdfFilePath 存储地址
	 * @return void
	 * 合同的创建对合同进行赋值
	 **/
	public String createPdf(String templateFilePath, HashMap<String, String> data, HashMap<String, String> imageData
			, boolean formFlattening, String pdfFilePath){
		System.out.println( "模板Path===>" + templateFilePath );
		PdfReader reader = null;
		ByteArrayOutputStream bos = null;
		PdfStamper pdfStamper = null;
		File file = null;
	//	BufferedOutputStream buf=null;
		System.out.println( pdfFilePath );
		try{
			// 读取PDF模版文件
			reader = new PdfReader(templateFilePath);
			// 输出流
			bos = new ByteArrayOutputStream();
			// 构建PDF对象
			pdfStamper = new PdfStamper(reader, bos);
			
			// 获取表单数据
			AcroFields form = pdfStamper.getAcroFields();

			// 使用中文字体 使用 AcroFields填充值的不需要在程序中设置字体，在模板文件中设置字体为中文字体 Adobe 宋体 std L
//			BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
//			form.addSubstitutionFont(bfChinese);
//
			// 表单赋值
			for(String key : data.keySet()){
				form.setField(key,data.get(key));
				System.out.println(key+""+data.get(key));
				// 也可以指定字体
//				form.setFieldProperty(key, "textfont", bfChinese, null);
			}
			// 添加图片
			if(null != imageData && imageData.size() > 0) {
				for (String key : imageData.keySet()) {
					System.out.println("进入图片添加");
					int pageNo = form.getFieldPositions(key).get(0).page;
					Rectangle signRect = form.getFieldPositions(key).get(0).position;
					float x = signRect.getLeft();
					float y = signRect.getBottom();
					System.out.println(x);
					System.out.println(y);
					// 读图片
					Image image = Image.getInstance(imageData.get(key));
					
					// 获取操作的页面
					PdfContentByte under = pdfStamper.getOverContent(pageNo);
					// 根据域的大小缩放图片
					image.scaleToFit(signRect.getWidth(), signRect.getHeight());
					// 添加图片
					image.setAbsolutePosition(x, y);
					under.addImage(image);
				}
			}
			
			// 如果为false那么生成的PDF文件还能编辑，一定要设为true
			pdfStamper.setFormFlattening(formFlattening);
			pdfStamper.close();
			
			file=new File(pdfFilePath);
			// 保存文件
			OutputStream output = new FileOutputStream(file);
			
			BufferedOutputStream bufferedOutput = new BufferedOutputStream(output);
			
			bufferedOutput.write(bos.toByteArray());
			
		}catch (Exception e){
			System.out.println("合同存储 1.字体失败，2.赋值失败");
		}
		
		// 将生成的合同上传到oss服务器中
		String url= null;
		try {
			url = ossService.feignUpload(getMultipartFile(file));
			System.out.println(url);
		}catch (Exception e){
			System.out.println("获取数据路径失败");
		}
		return url;
	}
	
	/**
	 * 封装表单文件上传MultipartFile对象
	 * @param file  封装的文件对象
	 */
	public MultipartFile getMultipartFile(File file) {
		DiskFileItem item = new DiskFileItem("file"
				, MediaType.MULTIPART_FORM_DATA_VALUE
				, true
				, file.getName()
				, (int)file.length()
				, file.getParentFile());
		try {
			OutputStream os = item.getOutputStream();
			os.write(FileUtils.readFileToByteArray(file));
		} catch (IOException e) {
			e.printStackTrace();
		}
		return new CommonsMultipartFile(item);
	}
	
}
